Smartspawns implements masking an intro block command so it is not executed when a certain number of players are playing
	Originally this was implemented as a stand-alone patch, but nobody used it.  Can't blame them - it was a stupid and confusing format
	This version is simpler and backwards-compatible with non-patched ROMs.
V3 is probably final unless there's other flags that become necessary
	
Patch only applies to intro types 0-2
If I may digress, it would be a good idea to force the other intro types in multiplayer...

3A2F4	7F0057C4
		load camera/intro type value: calls next 9 entries
	3A5AC	7F005A7C	*0 spawn point
	3A620	7F005AF0	*1 weapon
	3A6A8	7F005B78	*2 ammo
	3A6D0	7F005BA0	3 swirling intro camera
	3A758	7F005C28	4 intro animation
	3A76C	7F005C3C	5 cuff/character
	3A780	7F005C50	6 fixed cameras
	3A844	7F005D14	7 watch time
	3A8BC	7F005D8C	8 credits

+_+

General technique:
  These use JR's to get to each specific type, and then branch to the end.
  A generic code thingy can be linked in as a branch and the original return offset, like so:
	BEQ	R0,R0,[smart]
	ADDIU	T8,T8,0008
  Then, end the smart segment with JR T8 to return to the next op of whatever sent you there!
  That's the sort of idea only tea-induced delerium can muster.
  
This code based on the original smartspawn concept in rand+
uses 40<<#players to simulate 2^#players
so:
1	0080	1pl (solo)
2	0100	2pl
3	0200	3pl
4	0400	4pl
  For difficulty mask, add 6...
5	0800	multi
6	1000	agent
7	2000	secret
8	4000	00
9	8000	007

So, that means up to 127 sets
0x0080 is solo flag test
0x0F00 is multiplayer test flags
0xF000 is solo difficulty tests

By necessity, since these commands are different sizes for different types,
  You must feed it T7=set number
0  920F000B	LBU	T7,000B (S0)
1  920F000F	LBU	T7,000F (S0)
2  920F000F	LBU	T7,000F (S0)

[smart]	accepts: T7=set# from command
7F005B58:	3A688	SMARTSPAWN SUBROUTINE
2705000C	ADDIU	A1,T8,000C	;Presumes linking back to subroutine
0FC26919	JAL	7F09A464	;V0=#players
24010040	ADDIU	AT,R0,0040
0FC2FF04	JAL	7F0BFC10	;V0=difficulty
00415004	SLLV	T2,AT,V0	;T2=2^#players	40<<#
0FC30288	JAL	7F0C0A20	;V0=set# for intro or 0
24480006	ADDIU	T0,V0,0006	;T0=difficulty+6
01014004	SLLV	T0,AT,T0	;T2=difficulty	40<<#
010A5025	OR	T2,T0,T2	;T2=difficulty+player mask
3088007F	ANDI	T0,A0,007F	;T0=set number - playerflags
14480097	BNE	V0,T0,[end]	;kill command if not in set
01444024	AND	T0,T2,A0	;T0=set# & playerflags
15000095	BNEZ	T0,[end]	;kill if any of the killflags set
00000000	NOP
00A00008	JR	A1
00000000	NOP

+,+

&_&

note this was taken from code existing in '2710 spawn points.txt'
This is a hack of the existing implementation for the spawn point smartspawns restrictor

available:	AT,V0,V1,T0,T1,T2,T3,T4,T5,T6,T7,T8 (jumped it here),T9

7F005A7C:	3A5AC	Type 0: spawn
8E040008	LW	A0,0008 (S0)	//T7=set#
10000035	*BEQ	R0,R0,[smart]
2610000C	*ADDIU	S0,S0,000C
//7F005A88:	
3C018008	*LUI	AT,8008
8C229C28	*LW	V0,9C28 (AT)	//V0=80079C28 (spawn counter)
//7F005A90	expando!
8E08FFF8	LW	T0,FFF8 (S0)	;T0=preset
3C0A8007	LUI	T2,8007
290F2710	SLTI	T7,T0,2710	;T7=TRUE if not a 2710 preset
55E00004	BNEZL	T7,[grab]	;branch if using a 0xxx preset
3409002C	ORI	T1,R0,002C	;T1=0x2C: 0xxx preet multiplier
34090044	ORI	T1,R0,0044	;T1=0x44: 2xxx preset mutliplier
254A0004	ADDIU	T2,T2,0004	;T2+=4: use 2xxx preset table
2508D8F0	ADDIU	T0,T0,D8F0	;T0=preset-2710: actual number in table
//7F005AB0	grab
01280019	MULTU	T1,T0
00027880	SLL	T7,V0,0x2	;T4=offset in spawn pointer list
8D4A5D18	LW	T2,5D18 (T2)	;T2=p->preset list
002F7821	*ADDU	T7,AT,T7	;T7=spawn list + offset: p->current entry
00004812	MFLO	T1		;T1=offset in spawn pointer list
012A4021	ADDU	T0,T1,T2	;T0=address of preset
ADE89C2C	*SW	T0,9C2C (T7)	;current spawn entry=p->preset
24420001	ADDIU	V0,V0,0001	;count++
//7F005AD0:	end
100000C4	BEQ	R0,R0,7F005DE4	;return
AC229C28	SW	V0,9C28 (AT)	;save new count

00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP

&.&

7F005AF0	3A620	Type 1: weapon
7F005AD8	3A608	Type 1: weapon
	note: can't send both to the x2 weapon handler or else r.weapons don't appear in watch menu
	however, 7F005710 can accept -1 without issues ;*)
8E04000C	LW	A0,000C (S0)	//T7=set#
10000020	*BEQ	R0,R0,[smart]
26100010	*ADDIU	S0,S0,0010
//7F005AE4	preload!
0FC015C4	JAL	7F005710	;preload: sets weapon model for generated object
8E04FFF4	LW	A0,FFF4 (S0)	;A0=right weapon
0FC015C4	JAL	7F005710	;preload: sets weapon model for generated object
8E04FFF8	LW	A0,FFF8 (S0)	;A0=left weapon
//7F005AF4	grab #'s again
8E04FFF4	LW	A0,FFF4 (S0)	;A0=right weapon
8E05FFF8	LW	A1,FFF8 (S0)	;A1=left weapon
//7F005AFC	sort out if 1st set
8FAE007C	LW	T6,007C (SP)
15C00005	BNEZ	T6,7F005B70	;skip if not first weapon
3C018008	LUI	AT,8008
AC2499E0	SW	A0,99E0 (AT)	;r.weapon->800799E0
5CA00001	BGTZL	A1,7F005B70	;skip if no left weapon - technically not required, but I'd rather it not introduce a bug at a later date
AC2599E4	SW	A1,99E4 (AT)	;l.weapon->800799E4
AFA1007C	SW	AT,007C (SP)	;SP+7C= nonzero.  Stupid, but nonzero
//7F005B18	sort out what adds them to inventory
3C187F09	*LUI	T8,7F09
04A20002	BLTZL	A1,+2	;r-weapon only
2718C488	*ADDIU	T8,T8,C488	;add weapon A0 to inventory
2718C50C	*ADDIU	T8,T8,C50C	;add doubles (A0+A1) to inventory
0300F809	JALR	RA,T8	;emulators require you to write it so; console assumes RA if rt=0
00000000	NOP
//7F005B30:	right-weapon only
100000AC	BEQ	R0,R0,7F005DE4
00000000	NOP
00000000	*NOP
00000000	*NOP
//7F005B38:	sets default weapon drawn at start?
//7F005B40:
00000000	NOP
00000000	*NOP
00000000	NOP
00000000	*NOP
00000000	*NOP
00000000	*NOP
00000000	NOP
//7F005B70:

&,&

7F005B78	3A6A8	Type 2: ammo
7F005B38	3A668	Type 2: ammo
//7F005B40:
8E04000C	LW	A0,000C (S0)	//T7=set#
10000006	*BEQ	R0,R0,[smart]
26100010	ADDIU	S0,S0,0010
8E04FFF4	LW	A0,FFF4 (S0)	;A0=ammo type
0FC1A44C	JAL	7F069130	;add ammo type A0, total A1 to inventory
8E05FFF8	LW	A1,FFF8 (S0)	;A1=ammo total
//7F005B58:
100000A4	BEQ	R0,R0,7F005DE4
00000000	*NOP
//7F005B60:	3A690
00000000	*NOP
00000000	NOP

^_^

set p->newTLB
that's in 21990: 0x2E420	7F005AD8 7F005B38 
	8004F1B0

